//package com.cj.user.service.redis;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.ResponseBody;
//
//import java.util.ArrayList;
//import java.util.UUID;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Author cheng jun
// * @Description: String:set、get，可以存储json字符串；
// *               Hash:hset、hmset、hget、hmget，可以用在购物车场景；
// *               list: leftpush、leftpop可以用在分布式栈数据结构，leftpush、rightpop可以用在分布式队列数据结构，应用场景：
// *               例如社交网站的消息流，最新的消息排在前面；
// *               set:sadd、smembers、spop、sinter(交集)、sunion(并集)、sdiff(差集)、可以用在小程序抽奖、微信朋友圈点赞、收藏、
// *               标签、关注模型场景；
// *               Zset:zadd、zincrby可以用在热点新闻排行,底层是跳表，将链表改造为有序的并且添加索引，使之新增、删除、查询都很快，
// *               但是创建跳表要废一些时间，用时间换空间(当存储元素大于128转为跳表，之前是压缩列表)；
// *               redis持久化方式：rdb(数据放到磁盘，速度快)和aof(存储redis命令,数据存储完整),一般使用混合持久化；
// * @Date 2021/7/19 23:10
// */
//@Controller
//public class RedisController {
//    @Autowired
//    private Redisson redisson;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    /**
//     * synchronized锁满足不了集群或者分布式环境下的高并发需求，出现超卖现象
//     * @return
//     */
//    @RequestMapping(value = "redis_lock", method = RequestMethod.POST)
//    @ResponseBody
//    public String redis_lock() {
//        synchronized (this) {
//            // 从redis拿库存
//            int inStock = Integer.parseInt(String.valueOf(redisTemplate.opsForValue().get("inStock")));
//            if (inStock > 0) {
//                // 重新设置库存大小
//                int realInStock = inStock - 1;
//                redisTemplate.opsForValue().set("inStock", realInStock);
//                System.out.println("减库存成功,剩余库存数:" + realInStock);
//            } else {
//                System.out.println("库存不够");
//            }
//        }
//
//        return "end";
//    }
//
//    /**
//     *redis分布式锁-----setnx的特性
//     * @return
//     */
//    @RequestMapping(value = "redis_lock2", method = RequestMethod.POST)
//    @ResponseBody
//    public String redis_lock2() {
//        // 分布式锁(同时设置锁的时间，避免程序执行中系统宕机后死锁的情况发生)
//        String distributedLock = "distributedLock";
//        String lock = UUID.randomUUID().toString();
//        Boolean lockBoolean = redisTemplate.opsForValue().setIfAbsent(distributedLock, lock, 10, TimeUnit.SECONDS);
//        if (!lockBoolean) {
//            return "供不应求";
//        }
//
//        try {
//            // 从redis拿库存
//            int inStock = Integer.parseInt(String.valueOf(redisTemplate.opsForValue().get("inStock")));
//            if (inStock > 0) {
//                // 重新设置库存大小
//                int realInStock = inStock - 1;
//                redisTemplate.opsForValue().set("inStock", realInStock);
//                System.out.println("减库存成功,剩余库存数:" + realInStock);
//            } else {
//                System.out.println("库存不够");
//            }
//        } finally {
//            // 释放锁(不管业务代码是否执行成功，都要释放锁)-----只有设置这把锁的线程才能释放这把锁
//            if (lock.equals(redisTemplate.opsForValue().get(distributedLock))) {
//                redisTemplate.delete(distributedLock);
//            }
//        }
//
//        return "end";
//    }
//
//    /**
//     *
//     * @return
//     */
//    @RequestMapping(value = "redis_lock3", method = RequestMethod.POST)
//    @ResponseBody
//    public String redis_lock3() {
//        // redisson的锁
//        String distributedLock = "distributedLock";
//        RLock redissonLock = redisson.getLock(distributedLock);
//        try {
//            redissonLock.lock();
//            // 从redis拿库存
//            int inStock = Integer.parseInt(String.valueOf(redisTemplate.opsForValue().get("inStock")));
//            if (inStock > 0) {
//                // 重新设置库存大小
//                int realInStock = inStock - 1;
//                redisTemplate.opsForValue().set("inStock", realInStock);
//                System.out.println("减库存成功,剩余库存数:" + realInStock);
//            } else {
//                System.out.println("库存不够");
//            }
//        } finally {
//            // 释放锁
//            redissonLock.unlock();
//        }
//
//        return "end";
//    }
//}
